<?xml version="1.0" encoding="UTF-8" ?>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 이 태그를 부를 때 접두사 c를 쓰겠다? p.355 표 5-3 참조 -->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>자바 표준 태그 라이브러리 : JSTL</title>
</head>
<body>
	<h1>자바 표준 태그 라이브러리 : JSTL</h1>
	<h3>개요</h3>
	<p>맵이나 콜렉션의 항목 순회, 조건에 따라 실행, XML/DB 처리, DB접근 및 조작 등의 일반적인 작업을 처리하는
		사용자 정의 태그 라이브러리의 집합을 의미</p>
	<p>jstl.java.net에서 API, implementation을 다운로드</p>
	<p>다운로드 받은 파일은 WEB-INF/lib에 저장하고 taglib 지시문으로 해당 라이브러리의 접두사와 uri를
		정의</p>

	<h3>JSTL 구성</h3>
	<p>core : 변수지원, 흐름제어, URL 관리 및 기타</p>
	<p>i18n : 인코딩처리, 날짜, 시간 표기</p>
	<p>functions : 콜렉션, 문자열 처리를 위한 다양한 메서드 지원</p>
	<p>sql : 데이터베이스 접근 및 처리 지원</p>
	<p>xml : xml 접근 및 처리 지원, 접두사는 xml</p>

	<hr />
	<h3>core</h3>
	<p>
		c:out - 표현식을 평가하고 결과를 JspWriter로 출력<br /> JSP2.x에서는 $&#123;}를 더 많이 사용<br />
		하지만, 변수값에 태그가 포함된 경우 xml escaping 을 위해 여전히 out 태그를 사용
	</p>
	<p>xml escaping : XSS 공격을 방지하기 위해 태그들을 특수분자로 변환하는 것을 의미</p>
	<p>c:set : 문자열 객체 생성 및 객체 유효범위 지정</p>
	<p>c:remove : 문자열 객체 제거</p>
	<p>if : 조건검사 태그, if문을 태그화 함</p>
	<p>choose, when, otherwise : 다중조건 검사, switch문을 태그화 함</p>

	<p>forEach : 반복처리 태그, for문을 태그화 함</p>
	<p>forEach-var :</p>
	<p>forEach-varStatus : forEach의 상태를 확인할 수 있음, count(처음부터 순서),
		last(마지막인지 검사), first(처음인지 검사), index(위치값), current(현재 반복횟수 표시) 등을
		사용가능</p>
	<p>url : 주소 및 질의문자열 작성을 쉽게할 수 있음</p>
	<p>질의문자열은 param 태그를 추가적으로 작성해야 함</p>
	<p>redirect : 페이지 이동을 제어하는 태그, 클라이언트에게 지정한 url로 요청하도록 지시함</p>

	<hr />
	<p>
		스크립트릿 :
		<%="오우야아아아아앙"%></p>
	<p>
		<c:out value="오우야아아아아앙" />
	</p>
	<p>
		스크립트릿 :
		<%
		String msg = "<p style='color:red'>키얏~</p>";
		out.println(msg);
	%>
	</p>
	<p>
		c:set -
		<c:set var="msg" value="키얏키얏!!" />
		<c:out value="${msg}" />
		보다는 EL표현식 ${msg} 추천
	</p>
	<p>
		c:set -
		<c:set var="msg" value="<p style='color:red'>키얏키얏!!</p>" />
		${msg}보다는
		<c:out value="${msg}" />
		추천
	</p>
	<p>
		XSS 테스트 -
		<c:set var="xss" value="<script>alert('키얏');</script>" />
	</p>
	${xss}
	<p>
		<c:set var="xss2" value="<script>while(true){alert('키얏');}</script>" />
	</p>
	<c:out value="${xss2}" />
	<%-- 	<c:out value="${xss2}" escapeXml="false"/> --%>
	<p>
		c:remove =
		<c:remove var="xss" />
		<c:remove var="xss2" />
		<c:remove var="msg" />
		${xss},${xss2 },${msg}
	</p>

	<hr />
	<%
		if (request.getParameter("uid") != null
				&& request.getParameter("pwd") != null) {
			if (request.getParameter("uid").equals("abc")
					&& request.getParameter("pwd").equals("987"))
				out.println("로그인 성공!!");
		}
	%>
	<%-- JSTL.jsp?uid=abc&pwd=987 --%>

	<p>
		<c:if test="${param.uid eq 'xyz' and param.pwd eq '123' }">
			<span style="color: red">로그인 성공!!</span>
		</c:if>
	</p>
	<p>
		<c:if test="${param.uid ne 'xyz' or param.pwd ne '123' }">
			<span style="color: blue">로그인 실패!!</span>
		</c:if>
	</p>
	<p>
		<c:if test="${param.uid eq 'xyz' and param.pwd eq '123' }"
			var="loginCheck" />
		${ (loginCheck)? "로그인 앗싸!" : "로그인 우이씨~" }
	</p>
	<%-- mtype:1(member), 2(guest), 나머지--%>
	<%-- member-정회원입니다!, guest - 손님입니다!! --%>
	<%-- 나머지 - 로그인하세요! --%>
	<p>
		<c:if test="${param.mtype eq '1' }">정회원입니다</c:if>
		<c:if test="${param.mtype eq '2' }">손님입니다</c:if>
		<c:if test="${param.mtype ne '1' and param.mtype ne '2' }">로그인하세요</c:if>
	</p>

	<hr />
	<p>
		<c:choose>
			<c:when test="${param.mtype eq '1' }">정회원이시네요!</c:when>
			<c:when test="${param.mtype eq '2' }">손님이시네요!!</c:when>
			<c:otherwise>로그인하세요!!</c:otherwise>
		</c:choose>
	</p>

	<hr />

	<p>
		<%
			for (int i = 1; i <= 10; ++i)
				out.println(i);
		%>
		<c:forEach var="i" begin="1" end="10" step="1">
			${ i }
		</c:forEach>
	</p>
	<p>
		<%
			for (int i = 10; i >= 1; --i)
				out.println(i);
		%>
		<c:forEach var="i" begin="1" end="10" step="1">
			${ 11-i }
		</c:forEach>
	</p>

	<p>
		<%
			for (int i = 10; i >= 1; --i)
				out.println(i);
		%>
		<c:forEach var="i" begin="1" end="10" step="1" varStatus="status">
			<br />[${ 11-i }] : ${ status.count } / ${status.first} / ${ status.last } / ${status.current }
					/ ${status.index } / ${status.begin } / ${status.end } / ${status.step }
		</c:forEach>
	</p>
	<p>
		<c:forEach var="i" begin="1" end="10" step="1" varStatus="status">
			${status.end-i+1 }&nbsp;
		</c:forEach>
	</p>
	<p>
		<%
			List<String> games = new ArrayList<>();
			games.add("와우");
			games.add("디아");
			games.add("스타");
			games.add("롤");
			games.add("하스");

			for (String g : games)
				out.println(g);
			for (int i = 0; i < games.size(); i++) {
				String g = games.get(i);
				out.println(g);
			}
		%>
		<br />
		<c:forEach var="g" items="<%=games%>">
			[${g}]&nbsp;
		</c:forEach>
	</p>
	<p>
		<%
			Map<String,String> member = new HashMap<String,String>();
			member.put("1", "수지");
			member.put("2", "혜교");
			member.put("3", "지현");
		%>
		<c:forEach var="m" items="<%=member%>">
		${m}| ${m.key} | ${m.value} &nbsp;&nbsp;&nbsp;&nbsp;
	</c:forEach>
	</p>
	<p>
		<c:url var="google" value="http://google.co.kr" />
		<a href="${google}">링크테스트</a>
		<c:url var="el" value="./EL.jsp" />
		<a href="${el}">링크테스트2</a>
		<c:url var="jstl" value="./JSTL.jsp?uid=123&pwd=xyz" />
		<a href="${jstl}">링크테스트3a</a>
		<c:url var="jstl2" value="./JSTL.jsp">
			<c:param name="uid" value="abc" />
			<c:param name="pwd" value="987" />
		</c:url>
		<a href="${jstl2 }">링크테스트3b</a>
	</p>
	
	<p>예제)링크 자동생성기</p>
	<p>구글 - http://google.co.kr</p>
	<p>다음 - http://daum.net</p>
	<p>파코즈 - http://parkoz.com</p>
	<p>위 내용을 토대로 ArrayList 또는 HashMap, forEach, url 등을 이용해서 링크를 생성하세요</p>
	<hr/>
	
	<p>
		<%
			List<String> url1 = new ArrayList<>();
			url1.add("구글|http://google.co.kr");
			url1.add("다음|http://daum.net");
			url1.add("파코즈|http://parkoz.com");			
		%>
		<c:set var="url1" value="<%=url1 %>"></c:set>
		<c:forEach var="u1" items="${url1 }">
			<%-- <c:forEach var="txt" items="${fn:split(u1,'|') }"></c:forEach> --%>
				 <c:url var="u" value="${fn:split(u1,'|')[1] }"/>
				<a href="${u }">${fn:split(u1,'|')[0]}</a>	
			
		</c:forEach>
	</p>
	
	<% 
		Map<String,String>url2 = new HashMap<>();
		url2.put("구글","http://google.co.kr");
		url2.put("다음","http://daum.net");
		url2.put("파코즈","http://parkoz.com");		
	%>
		<c:forEach var="u2" items="<%=url2 %>">
			<c:url var="u" value="${u2.value}"/>
			<a href="${u}">${u2.key}</a>
		</c:forEach>
</body>
</html>














